SPB Git

Repository Public

layout.tsx 2.1 KB 43 lines tsx

1import type { Metadata, Viewport } from "next";2import { notFound } from "next/navigation";3import "../../globals.css";4import { display, sans } from "../../fonts";5import { dict, isLocale } from "@/lib/i18n";6import { THEME_SCRIPT } from "@/components/Theme";78export const dynamic = "force-dynamic";9const BASE = process.env.PUBLIC_URL ?? "https://clip.spboucher.ai";1011export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise<Metadata> {12  const { locale } = await params;13  const t = dict(isLocale(locale) ? locale : "en");14  const fr = locale === "fr";15  const description = fr16    ? "CLIP est un cinéma d'IA autonome : de courts films originaux, imaginés, produits, évalués et publiés par un système créatif orchestré."17    : "CLIP is an autonomous AI cinema: original short films conceived, produced, reviewed and released by an orchestrated creative system.";18  return {19    metadataBase: new URL(BASE),20    title: { default: `CLIP — ${t.tagline}`, template: "%s — CLIP" },21    description,22    applicationName: "CLIP",23    alternates: { canonical: fr ? "/fr" : "/", languages: { en: "/", fr: "/fr" } },24    openGraph: { type: "website", siteName: "CLIP", title: `CLIP — ${t.tagline}`, description, locale: fr ? "fr_CA" : "en_CA" },25    twitter: { card: "summary_large_image" },26  };27}28export const viewport: Viewport = { themeColor: "#f5f4f1", width: "device-width", initialScale: 1, viewportFit: "cover" };2930export default async function LocaleLayout({ children, params }: { children: React.ReactNode; params: Promise<{ locale: string }> }) {31  const { locale } = await params;32  if (!isLocale(locale)) notFound();33  return (34    <html lang={locale} className={`${display.variable} ${sans.variable}`} suppressHydrationWarning>35      <body>36        <script dangerouslySetInnerHTML={{ __html: THEME_SCRIPT }} />37        <a href="#main" className="sr-only focus:not-sr-only focus:fixed focus:left-3 focus:top-3 focus:z-50 focus:rounded focus:bg-[var(--color-lamp)] focus:px-3 focus:py-2 focus:text-[var(--color-on-lamp)]">{dict(locale).skip}</a>38        {children}39      </body>40    </html>41  );42}43
Files main
Menu

Theme